﻿//***********************************************************
//根据原有验证框架进行改进
//使用时候需要给要增加验证的标签增加check属性
//***********************************************************
//获得所有需要验证的标签
var BJ_LEN_ERR_TIP = "lenErrTip", BJ_REG_ERR_TIP = "regErrTip";
(function($) {
    $(document).ready(function() {
        $("select[reg],textarea[reg],input[reg],select[checkLen],input[checkLen],textarea[checkLen]").tooltip();
    });
})(jQuery);

function checkContextLen(ctl) {
    var checkLenVal = ctl.attr("checkLen");
    var ssLenVal = checkLenVal.toString().split(":");
    if (ssLenVal.length == 2) {
        var minLen = ssLenVal[0];
        var maxlen = ssLenVal[1];
        var contextLen = ctl.attr('value').toString().length;
        var errTipVal = "";
        if (contextLen < minLen || contextLen > maxlen) {
            if (contextLen == 0 && minLen > 0)
                errTipVal = "不能这空";
            if (contextLen > minLen && contextLen > maxlen)
                errTipVal = "内容长度不能超出[" + maxlen + "],实际为:[ " + contextLen + "]";
        }
        if (errTipVal.length == 0) {
            ctl.removeAttr(BJ_LEN_ERR_TIP).removeClass('tooltipinputerr').addClass('tooltipinputok');
        } else {
            ctl.attr(BJ_LEN_ERR_TIP, errTipVal).removeClass('tooltipinputok').addClass('tooltipinputerr');
            return false;
        }
    }
    return true;
}

function checkContextByReg(ctl) {
    var regVal = ctl.attr('reg');
    if (regVal != '') {
        var thisReg = new RegExp(regVal);
        if (thisReg.test(this.value)) {
            ctl.removeClass('tooltipinputerr').addClass('tooltipinputok');
        } else {
            ctl.removeClass('tooltipinputok').addClass('tooltipinputerr');
            return false;
        }
    }
    return true;
}

(function($) {
    $.fn.tooltip = function(options) {
        var getthis = this;
        var opts = $.extend({}, $.fn.tooltip.defaults, options);
        $('body').append('<table id="tipTable" class="tableTip"><tr><td  class="leftImage"></td> <td class="contenImage"'
            + ' align="left"></td> <td class="rightImage"></td></tr></table>');
        $(document).mouseout(function() { $('#tipTable').hide(); });
        this.each(function() {
            $(this).mouseover(function() {
                if ($(this).hasClass("tooltipinputerr")) {
                    var errInfo = $(this).attr(BJ_LEN_ERR_TIP);
                    if (errInfo == '') errInfo = $(this).attr(BJ_REG_ERR_TIP);
                    if (errInfo != '') {
                        $('#tipTable').css({ left: $.getLeft(this) + 'px', top: $.getTop(this) + 'px' });
                        $('.contenImage').html(errInfo);
                        $('#tipTable').fadeIn("fast");
                    }
                }
            },
            function() {
                $('#tipTable').hide();
            });
        });
        if ($(this).attr('checkLen') != '' || $(this).attr('reg') != '') {
            $(this).focus(function() {
                $(this).removeClass('tooltipinputerr');
            }).blur(function() {
                if ($(this).attr('toupper') == 'true') {
                    this.value = this.value.toUpperCase();
                }
                var reVal = checkContextLen($(this));
                if (reVal) checkContextByReg($(this));
            });
        }
        if (opts.onsubmit) {
            $('form').submit(function() {
                var isSubmit = true;
                getthis.each(function() {
                    isSubmit = checkContextLen($(this));
                });
                return isSubmit;
            });
        }
    };

    $.fn.clareTooltip = function() {
        this.remove(BJ_LEN_ERR_TIP).remove(BJ_REG_ERR_TIP).remove('checkLen').remove('reg');
    };

    $.extend({
        getWidth: function(object) {
            return object.offsetWidth;
        },

        getLeft: function(object) {
            var go = object;
            var oParent, oLeft = go.offsetLeft;
            while (go.offsetParent != null) {
                oParent = go.offsetParent;
                oLeft += oParent.offsetLeft;
                go = oParent;
            }
            return oLeft;
        },

        getTop: function(object) {
            var go = object;
            var oParent, oTop = go.offsetTop;
            while (go.offsetParent != null) {
                oParent = go.offsetParent;
                oTop += oParent.offsetTop;
                go = oParent;
            }
            return oTop + $(object).height() + 5;
        },
        onsubmit: true
    });
    $.fn.tooltip.defaults = { onsubmit: true };
})(jQuery);
//***************************************************************************************************************************************************
//利用JQuery功能对标签属性设置表达式
//传入的标签ID组必须为"name1:name2:name3"中间用':'分隔.
function setCheckReg(validatorString, regVal) {
    var validatorStrings = "";
    if (validatorString != "") {
        validatorStrings = validatorString.split(":");
        for (var i = 0; i < validatorStrings.length; i++) {
            $("#" + validatorStrings[i]).attr("reg", regVal);
        }
    }
}

//对所有需要整数验证的标签进行设置正则表达式
function setIntegeCheck(validatorString) {
    setCheckReg(validatorString, "^[1-9]\\d*$");
}

//对所有需要金额验证的标签进行设置正则表达式
function setMoneyCheck(validatorString) {
    setCheckReg(validatorString, "^(-)?(([1-9]{1}\\d*)|([0]{1}))(\\.(\\d){1,2})?$");
}

//对所有需要正浮点验证的标签进行设置正则表达式
function setFloatCheck(validatorString) {
    setCheckReg(validatorString, "^[0-9]+\\.[0-9]+$");
}

//对所有需要电子邮件验证的标签进行设置正则表达式
function setMailCheck(validatorString) {
    setCheckReg(validatorString, "^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$");
}

//对所有需要邮编验证的标签进行设置正则表达式
function setZipcodeCheck(validatorString) {
    setCheckReg(validatorString, "^\\d{6}$");
}

//对所有需要手机验证的标签进行设置正则表达式
function setMobileCheck(validatorString) {
    setCheckReg(validatorString, "^(13|15)[0-9]{9}$");
}

//对所有需要身份证验证的标签进行设置正则表达式
function setIDCheck(validatorString) {
    setCheckReg(validatorString, "^[1-9]([0-9]{14}|[0-9]{17})$");
}

//对所有需要登录帐号验证的标签进行设置正则表达式
function setUserIDCheck(validatorString) {
    setCheckReg(validatorString, "^\\w+$");
}

//对所有需要非空验证的标签进行设置正则表达式
function setEmptyCheck(validatorString) {
    setCheckReg(validatorString, ".*\\S.*");
}

//对所有需要中文验证的标签进行设置正则表达式
function setChineseCheck(validatorString) {
    setCheckReg(validatorString, "^[\\u4E00-\\u9FA5\\uF900-\\uFA2D]+$");
}

//对所有需要URL验证的标签进行设置正则表达式
function setURLCheck(validatorString) {
    setCheckReg(validatorString, "^http[s]?:\\/\\/([\\w-]+\\.)+[\\w-]+([\\w-./?%&=]*)?$");
}
//匹配国内电话号码(0511-4405222 或 021-87888822) 
function setTell(validatorString) {
    setCheckReg(validatorString, "\\d{3}-\\d{8}|\\d{4}-\\d{7}");
}
//***************************************************************************************************************************************************